package com.reliable.service.utils;

import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.AES;

import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * AES解密测试工具类
 * 用于手动输入加密内容进行解密测试
 */
public class AesDecryptTest {

    // 与导出银行卡数据时使用的相同密钥
    private static final String KEY = "bank:#h^U780^5g%";

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        AES aes = new AES(Mode.ECB, Padding.PKCS5Padding, KEY.getBytes(StandardCharsets.UTF_8), null);

        System.out.println("=== AES解密测试工具 ===");
        System.out.println("使用密钥: " + KEY);
        System.out.println("加密模式: ECB");
        System.out.println("填充方式: PKCS5Padding");
        System.out.println("输入 'exit' 退出程序");

        // 测试加密解密过程
        System.out.println("\n=== 测试示例 ===");
        String testData = "测试数据";
        String encrypted = aes.encryptHex(testData);
        String decrypted = aes.decryptStr(encrypted);
        System.out.println("测试数据: " + testData);
        System.out.println("加密结果: " + encrypted);
        System.out.println("解密结果: " + decrypted);
        System.out.println("解密是否正确: " + testData.equals(decrypted));

        while (true) {
            System.out.print("\n请输入要解密的内容 (16进制格式): ");
            String encryptedData = scanner.nextLine();

            if ("exit".equalsIgnoreCase(encryptedData)) {
                System.out.println("程序退出");
                break;
            }

            if (encryptedData.trim().isEmpty()) {
                System.out.println("输入内容不能为空");
                continue;
            }

            // 移除可能存在的空格
            encryptedData = encryptedData.replaceAll("\\s+", "");
            
            try {
                // 尝试多种解密方式
                System.out.println("\n尝试使用 decryptStr 方法解密:");
                String decryptedData = aes.decryptStr(encryptedData);
                System.out.println("解密结果: " + decryptedData);
            } catch (Exception e) {
                System.out.println("使用 decryptStr 解密失败: " + e.getMessage());
                
                try {
                    System.out.println("\n尝试使用 decrypt 方法解密:");
                    byte[] decryptedBytes = aes.decrypt(encryptedData);
                    String decryptedData = new String(decryptedBytes, StandardCharsets.UTF_8);
                    System.out.println("解密结果: " + decryptedData);
                } catch (Exception e2) {
                    System.out.println("使用 decrypt 解密也失败: " + e2.getMessage());
                }
            }
            
            // 提供更多信息帮助调试
            System.out.println("\n调试信息:");
            System.out.println("- 输入长度: " + encryptedData.length() + " 字符");
            System.out.println("- 是否为有效的十六进制字符串: " + isValidHex(encryptedData));
            if (encryptedData.length() % 32 != 0) {
                System.out.println("- 警告: 十六进制字符串长度应为32的倍数（AES块大小为16字节）");
            }
            
            // 额外测试：尝试加密一个已知字符串，看是否能得到相同的结果
            System.out.println("\n额外测试:");
            System.out.println("请输入您认为的原始明文内容（用于验证加密过程）:");
            String plainText = scanner.nextLine();
            if (!plainText.isEmpty() && !"exit".equalsIgnoreCase(plainText)) {
                try {
                    String reEncrypted = aes.encryptHex(plainText);
                    System.out.println("重新加密结果: " + reEncrypted);
                    System.out.println("与输入的密文是否相同: " + encryptedData.equalsIgnoreCase(reEncrypted));
                } catch (Exception e) {
                    System.out.println("重新加密失败: " + e.getMessage());
                }
            }
        }

        scanner.close();
    }
    
    /**
     * 检查字符串是否为有效的十六进制字符串
     */
    private static boolean isValidHex(String hex) {
        return hex.matches("^[0-9a-fA-F]+$");
    }
}